/*******************************************************************************
 * Copyright 2017 Bstek
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License.  You may obtain a copy
 * of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 * License for the specific language governing permissions and limitations under
 * the License.
 ******************************************************************************/
package com.bstek.ureport.expression.function.date;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;

import com.bstek.ureport.build.Context;
import com.bstek.ureport.exception.ReportComputeException;
import com.bstek.ureport.expression.function.Function;
import com.bstek.ureport.expression.model.data.ExpressionData;
import com.bstek.ureport.expression.model.data.ObjectExpressionData;
import com.bstek.ureport.expression.model.data.ObjectListExpressionData;
import com.bstek.ureport.model.Cell;
import com.bstek.ureport.utils.DateUtils;

/**
 * @author Jacky.gao
 * @since 2017年1月22日
 */
public class DateFunction implements Function {
	
	private String pattern = "yyyy-MM-dd HH:mm:ss";

	@Override
	public Object execute(List<ExpressionData<?>> params, Context context, Cell currentCell) {
		if(params == null || params.size() == 0) {
			LocalDateTime localDateTime = LocalDateTime.now();
			return DateTimeFormatter.ofPattern(pattern).format(localDateTime);
		}
		if(params.size() == 1) {
			ExpressionData<?> data = params.get(0);
			LocalDateTime localDateTime = LocalDateTime.now();
			return format(data, localDateTime);
		}
		if(params.size() == 2) {
			ExpressionData<?> data = params.get(0);
			Object obj = null;
			if (data instanceof ObjectListExpressionData) {
				ObjectListExpressionData listData = (ObjectListExpressionData) data;
				List<?> list = listData.getData();
				if (list != null && list.size() > 0) {
					obj = list.get(0);
				}
			} else if (data instanceof ObjectExpressionData) {
				ObjectExpressionData objData = (ObjectExpressionData) data;
				obj = objData.getData();
			}
			LocalDateTime localDateTime = DateUtils.toLocalDateTime(obj);
			if(localDateTime != null) {
				return format(params.get(1), localDateTime);
			}
			return null;
		}
		return null;
	}

	private String format(ExpressionData<?> data, LocalDateTime localDateTime) {
		if (data instanceof ObjectExpressionData) {
			ObjectExpressionData objectData = (ObjectExpressionData) data;
			String newPattern = (String) objectData.getData();
			return DateTimeFormatter.ofPattern(newPattern).format(localDateTime);
		} else {
			throw new ReportComputeException("Unknow date format pattern:" + data.getData());
		}
	}

	@Override
	public String name() {
		return "date";
	}
}
